S01-01 基础-入门
[TOC]
Java 概述
JavaSE 课程体系@

Java 职业晋升路线@

人机交互方式
图形化界面(Graphical User Interface,GUI),这种方式简单直观,使用者易于接受,容易上手操作。命令行界面(Command Line Interface,CLI),需要在控制台输入特定的指令,让计算机完成一些操作。需要记忆一些指令,较为麻烦。
计算机编程语言
计算机语言是什么
语言:是人与人之间用于沟通的一种方式。例如:中国人与中国人用普通话沟通。而中国人要和英国人交流,可以使用英语或普通话。计算机编程语言,就是人与计算机交流的方式。人们可以使用编程语言对计算机下达命令,让计算机完成人们需要的功能。计算机语言有很多种。如:C 、C++、Java、Go、JavaScript、Python、Scala 等。
体会:语言 = 语法 + 逻辑
计算机语言发展史
第一代:机器语言(相当于人类的石器时代)1946 年 2 月 14 日,世界上第一台计算机ENAC诞生,使用的是最原始的穿孔卡片。这种卡片上使用的是用二进制代码表示的语言,与人类语言差别极大,这种语言就称为机器语言。比如一段典型的机器码:
0000,0000,000000010000 代表 LOAD A, 16 0000,0001,000000000001 代表 LOAD B, 1 0001,0001,000000010000 代表 STORE B, 16这种语言本质上是计算机能识别的唯一语言,人类很难理解。可以大胆想象"此时的程序员 99.9%都是异类!"

第二代:汇编语言(相当于人类的青铜&铁器时代)使用英文缩写的助记符来表示基本的操作,这些助记符构成了汇编语言的基础。比如:
LOAD、MOVE等,使人更容易使用。因此,汇编语言也称为符号语言。优点:能编写高效率的程序
缺点:汇编语言是面向机器的,不同计算机机型特点不同,因此会有不同的汇编语言,彼此之间不能通用。程序不易移植,较难调试。

比起机器语言,汇编大大进步了,是机器语言向更高级的语言进化的桥梁。目前仍然应用于工业电子编程领域、软件的加密解密、计算机病毒分析等。
第三代:高级语言(相当于人类的信息时代)高级语言发展于 20 世纪 50 年代中叶到 70 年代,是一种接近于人们使用习惯的程序设计语言。它允许程序员使用接近日常英语的指令来编写程序,程序中的符号和算式也与日常用的数学式子差不多,接近于自然语言和数学语言,容易为人们掌握。比如:

高级语言独立于机器,有一定的通用性;计算机不能直接识别和执行用高级语言编写的程序,需要使用编译器或者解释器,转换为机器语言才能被识别和执行。


此外,高级语言按照程序设计方法的不同,又分为:面向过程的语言、面向对象的语言。
- C、Pascal、Fortran 面向过程的语言
- C++面向过程/面向对象
- Java 跨平台的纯面向对象的语言
- C#、Python、JavaScript、Scala…
目前以及可预见的将来,计算机语言仍然处于“第三代高级语言”阶段。但是不管是什么语言,最后都要向机器语言靠近,因为 CPU 只认识 0 和 1。
计算机语言排行榜
TIOBE:是一个流行编程语言排行,每月更新。排名权重基于世界范围内 工程师数量,Google、Bing、Yahoo! 、Wikipedia、Amazon、Youtube 和百度这些主流的搜索引擎,也将作为排名权重的参考指标。

计算机语言走势

编程语言,该学哪个?

网传的编程语言鄙视链:

- C 语言:万物之源
- 诞生于
1972年,由 AT&T 公司旗下贝尔实验室创建完成,用于构建 Unix 操作系统。- 偏向计算机底层操作(操作系统、网络、硬件驱动等)。
- 优势:几乎所有现代编程语言都脱胎于 C
- 劣势:相当陡的学习曲线;不支持面向对象编程
- C++语言:难学的语言
- 诞生于
1983年,作为 C 语言的增强方案、升级版本。C++是 C 语言的超集,C 语言的大部分知识也适用于 C++。- 用途:windows 或 MacOS UI、office 全家桶、主流的浏览器、Oracle、MySQL、著名的游戏引擎(如星际争霸、魔兽世界)等
- 优势:很多公司都用 C++ 开发核心架构,如 Google、腾讯、百度、阿里云等;面向对象性
- 劣势:体系极为庞大,这是世界目前来说
最复杂也是最难的编程语言。
- C#语言:背靠大树的语言
- 诞生于
2000年,一款强大而灵活的编程语言。靠着微软这棵大树,是多年来 windows 平台的一门主流编程语言。- 用途:windows 桌面应用开发、Windows Azure、游戏开发
- PHP 语言:最好的语言?
- 诞生于 1994 年,一款
服务器端脚本语言。最初表示个人主页(Personal Home Page)- PHP 语法和 C 类似,有很多的模板和框架,简单易懂,也许你可以在短短几天做出 web app。它主要用于 web 端,快速建站网络开发
- 劣势:学习门槛太低;其代码运行速度低于大部分编程语言党争对手
- Python:易学的语言
- 诞生于 1991 年,一种面向对象的语言,虽然运行效率不高,但是
开发效率非常高。- Python 被称为
胶水语言,哪里都可以用。
- JavaScript 语言:前端为王
- 诞生于 1995 年,网景公司开发完成。
- JavaScript 是目前
所有主流浏览器上唯一支持的脚本语言。在前端开发中,占有不可替代的地位。
- Java 语言:需求旺盛
- 创建于 1995 年,Java 是一种面向对象、基于类的编程语言。
- Java 可能是目前
运用最广的项目语言。代码稳定性超过 C 和 C++,生产力远超 C 和 C++。有 JVM 在,可以轻松地跨平台。- 具有强大的开源开发工具,大量的开源共享库。
- Java 拥有世界上
数量最多的程序员,最不缺人。
- Go 语言:夹缝中生存
- Go 语言现在很受关注,它是取代 C 和 C++ 的另一门有潜力的语言。
- C 语言太原始了,C++ 太复杂了,Java 太高级了,所以 Go 语言就在这个夹缝中出现了。
- Go 语言已成为
云计算领域事实上的标准语言,尤其是在 Docker/Kubernetes 等项目中。- Go 语言语法特别简单,你有了 C 和 C++ 的基础,学习 Go 的学习成本基本为零。
- Go 社区从 Java 社区移植了各种优秀的框架或库。
总结:
- 程序设计语言有很多种,每种语言都是为了实现某个特定的目的而发明的。
- 没有“最好”的语言,只有在特定场景下相对来说,最适合的语言而已。
- 如果你掌握了一种编程语言,也会更容易上手其它的编程语言。关键是学习如何使用
程序设计方法来解决问题。这也是本套课程的主旨。 Talk is cheap,Show me the code。
Java 语言概述
Java 概述
是
SUN(Stanford University Network,斯坦福大学网络公司 )1995年推出的一门高级编程语言。是一种面向 Internet 的编程语言。Java 一开始富有吸引力是因为 Java 程序可以在
Web浏览器中运行。这些 Java 程序被称为Java小程序(applet),内嵌在 HTML 代码中。伴随着互联网的迅猛发展,以及 Java 技术在 web 方面的不断成熟,已经成为 Web 应用程序的首选开发语言。
Java 涉及到的领域:主要用于互联网领域,开发应用程序
- 各行各业的操作系统,网站
- 移动端:医疗设备上,超市打印小票机器,鸿蒙,安卓等
- 电商网站
- 物流管理
- 银行使用的操作系统等
- 桌面应用(idea)
- 企业级开发(服务器程序)
- 科学计算:机器人
- 大数据库开发:hadoop
- 游戏开发
Java 语言简史
起步阶段:
1991 年,Sun 公司的工程师小组想要设计一种语言,应用在电视机、电话、闹钟、烤面包机等家用电器的控制和通信。由于这些设备的处理能力和内存都很有限,并且不同的厂商会选择不同的中央处理器(CPU),因此这种语言的关键是代码短小、紧凑且与平台无关(即不能与任何特定的体系结构捆绑在一起)。
Gosling 团队率先创造了这个语言,并命名为“Oak"(起名的原因是因为他非常喜欢自己办公室外的橡树)。后因智能化家电的市场需求没有预期的高,Sun 公司放弃了该项计划。
随着 20 世纪 90 年代互联网的发展,Sun 公司发现该语言在互联网上应用的前景,于是改造了 Oak,于 1995 年 5 月以Java的名称正式发布。(Java 是印度尼西亚爪哇岛的英文名称,因盛产咖啡而闻名。)

发展阶段:
| 发行版本 | 发行时间 | 备注 |
|---|---|---|
| Java 1.0 | 1996.01.23 | Sun 公司发布了 Java 的第一个开发工具包 |
| Java 1.1 | 1997.02.19 | JavaOne 会议召开,创当时全球同类会议规模之最。 |
| Java 1.2 | 1998.12.08 | Java 拆分成:J2SE(标准版)、J2EE(企业版)、J2ME(小型版) |
| Java 1.3 | 2000.05.08 | |
| Java1.4 | 2004.02.06 | |
| Java 5.0 | 2004.09.30 | ① 版本号从 1.4 直接更新至 5.0;② 平台更名为 JavaSE、JavaEE、JavaME |
| Java 6.0 | 2006.12.11 | |
| 2009.04.20 | Oracle 公司收购 SUN,交易价格74亿美元。 | |
| Java 7.0 | 2011.07.02 | |
| Java 8.0 | 2014.03.18 | 此版本是继 Java 5.0 以来变化最大的版本。是长期支持版本(LTS) |
| Java 9.0 | 2017.09.22 | ① 此版本开始,每半年更新一次;②Java 9.0 开始不再支持 windows 32 位系统 |
| Java 10.0 | 2018.03.21 | |
| Java 11.0 | 2018.09.25 | JDK 安装包取消独立 JRE 安装包,是长期支持版本(LTS) |
| Java 12.0 | 2019.03.19 | |
| ... | ... | |
| Java17.0 | 2021.09 | 发布 Java 17.0,版本号也称为 21.9,是长期支持版本。 |
| ... | ... | |
| Java19.0 | 2022.09 | 发布 Java19.0,版本号也称为 22.9。 |
Java 之父

- 詹姆斯·高斯林(James Gosling) 先生以“Java 技术之父”而闻名于世。他是 Java 技术的创始人,他亲手设计了 Java 语言,并开发了 Java 编译器和 Java 虚拟机,使 Java 成为了世界上最流行的开发语言。
- James Gosling 于 1984 年加入 Sun 公司,并一直服务于 Sun 公司,直至 2010 年前后,Sun 被 Oracle 并购而加入 Oracle,担任客户端软件集团的首席技术官; 2010 年 4 月从 Oracle 离职。
公司八卦
- SUN 与 Oracle
SUN 是一家
极具创新能力的公司,2001 年 “9.11”以前,SUN 公司市值超过1000亿美元。 但是没能利用 Java 构建一个强有力、可变现的生态系统,没打好 Java 这张牌。此后,互联网泡沫破裂,硬件需求大幅减少,它的市值在一个月之内跌幅超过 90%。SUN 公司的成长用了 20 年,而衰落只用了 1 年!

- Oracle 与 Google
Google 和 Oracle 的侵权事件:
2010 年 8 月,Oracle 起诉 Google 的 Android 系统侵权,要求赔偿 26 亿美元。
- Oracle 认为 Google 的代码中使用了 Java 的
37个API,并且认为 Google 是故意为之,因为这样做的好处是可以让更多的 Java 程序员更容易接受 Android 的代码。- Oracle 认为 Android 中有
9行代码直接抄袭了 Java 的实现。这 9 行牛气哄哄的代码都出自一人之手,他就是 Java 大牛------Joshua Bloch。2018 年 3 月,美国联邦巡回上诉法院裁决,谷歌侵犯了甲骨文的版权,支付高达
88亿美元的赔偿金。2021 年 4 月,美国最高法院给出了最终裁决:谷歌胜诉,其代码属于“合理使用”的范畴。为期十多年的软件行业“第一版权案”落幕。
//Code In OpenJDK / Android :
private static void rangeCheck(int arrayLen, int fromIndex, int toIndex) {
if (fromIndex > toIndex)
throw new IllegalArgumentException("fromIndex(" + fromIndex +
") > toIndex(" + toIndex+")");
if (fromIndex < 0)
throw new ArrayIndexOutOfBoundsException(fromIndex);
if (toIndex > arrayLen)
throw new ArrayIndexOutOfBoundsException(toIndex);
}
Java 技术体系平台@
- Java SE(Java Standard Edition)标准版
- 支持面向
桌面级应用(如 Windows 下的应用程序)的 Java 平台,即定位个人计算机的应用开发。 - 包括用户界面接口 AWT 及 Swing,网络功能与国际化、图像处理能力以及输入输出支持等。
- 此版本以前称为 J2SE
- 支持面向
- Java EE(Java Enterprise Edition)企业版
- 为开发企业环境下的应用程序提供的一套解决方案,即定位
在服务器端的Web应用开发。 - JavaEE 是 JavaSE 的扩展,增加了用于服务器开发的类库。如:Servlet 能够延伸服务器的功能,通过请求-响应的模式来处理客户端的请求;JSP 是一种可以将 Java 程序代码内嵌在网页内的技术。
- 版本以前称为 J2EE
- 为开发企业环境下的应用程序提供的一套解决方案,即定位
- Java ME(Java Micro Edition)小型版
- 支持 Java 程序运行在
移动终端(手机、机顶盒)上的平台,即定位在消费性电子产品的应用开发 - JavaME 是 JavaSE 的内伸,精简了 JavaSE 的核心类库,同时也提供自己的扩展类。增加了适合微小装置的类库:javax.microedition.io.*等。
- 此版本以前称为 J2ME
- 支持 Java 程序运行在

注意:
Android 开发不等同于 Java ME 的开发
Java 开发工具
都有哪些开发 Java 的工具:
级别一:文本开发工具

级别二:集成开发环境(Integrated Development Environment,IDE)
把代码编写,编译,执行,调试等多种功能综合到一起的开发工具。

如何选择:
前期:我们先使用文本开发工具,培养代码感,利于公司笔、面试。
后期:我们使用IDE,提供更强大的功能支持。
Java API 文档
API(Application Programming Interface,应用程序编程接口):是 Java 提供的基本编程接口。
Java 语言提供了大量的基础类,因此 Oracle 也为这些基础类提供了相应的说明文档,用于告诉开发者如何使用这些类,以及这些类里包含的方法。大多数 Java 书籍中的类的介绍都要参照它来完成,它是编程者经常查阅的资料。
Java API 文档,即为 JDK 使用说明书、帮助文档。类似于新华字典。
Java API 文档地址:
- 在线看:https://docs.oracle.com/en/java/javase/17/docs/api/index.html
- 离线下载:https://www.oracle.com/java/technologies/javase-jdk17-doc-downloads.html
前置知识
字节【
字节:计算机上最小的计量单位叫做字节,用byte或者B表示。8个二进制位(bit)等于1个字节。

计量单位的进制换算:
8bit = 1B
1024B = 1KB
1024KB = 1MB
1024MB = 1GB
1024GB = 1TB
...DOS 常用命令@
DOS(Disk Operating System,磁盘操作系统):是 Microsoft 公司在 Windows 之前推出的一个操作系统,是单用户、单任务(即只能执行一个任务)的操作系统。现在被 Windows 系统取代。
对于 Java 初学者,学习一些 DOS 命令,会非常有帮助。
进入 DOS 操作窗口:
- 按下
Windows+R键盘,打开运行窗口 - 输入
cmd回车,进入到 DOS 的操作窗口。

常用指令:
文件/目录管理命令
dir:列出目录内容
功能:列出当前目录下的文件和子目录(类似 Linux 的 ls)。
常用参数:
/a:显示所有文件(包括隐藏文件和系统文件,隐藏文件默认不显示)。/s:递归显示当前目录及其所有子目录下的文件。/w:以宽格式显示(多列排列,节省空间)。/p:分页显示(内容过多时,按屏幕分页,按任意键继续)。
示例:
dir # 列出当前目录下的可见文件和目录
dir /a /s # 列出当前目录及子目录下的所有文件(含隐藏/系统文件)
dir C:\Windows /w # 宽格式列出 C:\Windows 目录下的内容cd:切换目录
功能:切换当前工作目录(类似 Linux 的 cd)。
常用用法:
cd <目录名>:进入当前目录下的子目录(如cd Documents)。cd ..:返回上一级目录(“..” 表示父目录)。cd \:直接返回当前磁盘的根目录(如 C 盘根目录C:\)。cd /d <盘符:\目录名>:跨磁盘切换目录(如cd /d D:\Downloads,不加/d无法直接切换盘符)。
示例:
cd Desktop # 进入当前目录下的 Desktop 子目录
cd ..\Music # 进入上一级目录的 Music 子目录
cd /d E:\Work # 切换到 E 盘的 Work 目录md/mkdir:创建目录
功能:创建新的子目录(md 和 mkdir 是等价命令)。
示例:
md NewFolder # 在当前目录下创建名为 NewFolder 的目录
mkdir D:\Test\Temp # 递归创建多级目录(即使 Test 目录不存在,也会自动创建)rd/rmdir:删除目录
功能:删除空目录(rd 和 rmdir 等价)。
常用参数:
/s:递归删除目录及其所有子目录和文件(危险!需谨慎)。/q:静默删除(不提示确认,配合/s使用时,直接删除所有内容)。
示例:
rd EmptyFolder # 删除当前目录下的空目录 EmptyFolder
rmdir /s /q OldDir # 强制、静默删除 OldDir 目录及其所有内容(无提示)copy:复制文件
功能:复制一个或多个文件到指定位置(类似 Linux 的 cp)。
常用参数:
/y:覆盖目标文件时不提示确认(默认会提示 “是否覆盖”)。/s:复制目录时,递归复制所有子目录和文件(仅用于复制目录)。/v:复制后验证文件完整性(确保复制无错误)。
示例:
copy file.txt D:\Backup # 把当前目录的 file.txt 复制到 D:\Backup 目录
copy /y *.docx E:\Docs # 把当前目录所有 .docx 文件复制到 E:\Docs,覆盖不提示
copy /s SourceDir TargetDir # 把 SourceDir 目录及其所有内容复制到 TargetDirmove:移动文件/目录
功能:移动文件或目录到指定位置,也可用于重命名文件 / 目录(类似 Linux 的 mv)。
常用参数:
/y:覆盖目标文件时不提示确认。
示例:
move report.pdf D:\Final # 把 report.pdf 移动到 D:\Final 目录
move /y oldname.txt newname.txt # 把 oldname.txt 重命名为 newname.txt(同一目录下)
move DataDir D:\Archive # 把 DataDir 目录移动到 D:\Archive 目录del:删除文件
功能:删除一个或多个文件(无法删除目录,类似 Linux 的 rm)。
常用参数:
/f:强制删除只读文件(默认无法删除只读文件)。/s:递归删除当前目录及其子目录下的指定文件。/q:静默删除(不提示确认)。
示例:
del temp.txt # 删除当前目录的 temp.txt 文件
del /f /s /q *.tmp # 强制、静默删除当前目录及子目录下所有 .tmp 临时文件
del D:\OldFiles\*.* # 删除 D:\OldFiles 目录下的所有文件(保留目录本身)ren/rename:重命名文件/目录
功能:重命名文件或目录(ren 和 rename 等价,与 move 重命名功能类似,但更简洁)。
示例:
ren photo.jpg vacation.jpg # 把 photo.jpg 重命名为 vacation.jpg
rename OldFolder NewFolder # 把 OldFolder 目录重命名为 NewFolder常用快捷键
Tab:自动补全命令或目录名(输入前几个字符,按 Tab 自动补全,多次按切换候选)。↑/↓:切换历史命令(查看之前执行过的命令,直接回车可重复执行)。Ctrl+C:终止当前正在执行的命令(如ping -t、tasklist等持续输出的命令)。Ctrl+Break:强制终止命令(与Ctrl+C类似,部分命令更适用)。F7:显示命令历史记录窗口,可选择之前执行的命令。
恢复经典 DOS 窗口
需求:“管理员身份” + “经典的控制台主机风格”的 DOS 窗口
通过注册表脚本不仅会在右键菜单中添加一个带 UAC 盾牌图标的安全选项,还会强制调用 conhost.exe 来运行 CMD,并精确定位到你当前所在的文件夹。
第1步:核心注册表代码:
按
Win + R打开运行,输入notepad回车,新建一个记事本。将以下代码完整复制并粘贴到记事本中:
bashWindows Registry Editor Version 5.00 ; 在文件夹空白处右键生效 [HKEY_CLASSES_ROOT\Directory\Background\shell\runas] @="以管理员身份运行经典 CMD" "HasLUAShield"="" "Icon"="cmd.exe" [HKEY_CLASSES_ROOT\Directory\Background\shell\runas\command] @="conhost.exe cmd.exe /s /k pushd \"%V\"" ; 在选中的文件夹图标上右键生效 [HKEY_CLASSES_ROOT\Directory\shell\runas] @="以管理员身份运行经典 CMD" "HasLUAShield"="" "Icon"="cmd.exe" [HKEY_CLASSES_ROOT\Directory\shell\runas\command] @="conhost.exe cmd.exe /s /k pushd \"%V\""runas键名:这是 Windows 的内置动词,系统识别到它会自动弹窗请求管理员权限 (UAC)。conhost.exe cmd.exe:强制绕过带有标签页的 Windows 终端,使用经典控制台启动 CMD。pushd \"%V\":抓取当前鼠标所在的准确路径,并将 CMD 的工作目录切换过去。
第2步:操作步骤:
点击记事本左上角的“文件” -> “另存为”。
将“保存类型”修改为“所有文件 (.)”。
设置文件的编码格式为
ANSI以正确显示中文。将“文件名”命名为
AdminClassicCMD.reg,保存到你的桌面上。双击运行桌面上这个
AdminClassicCMD.reg文件。在弹出的安全警告窗口中点击“是”,允许将其添加到注册表中。
在目标文件夹中的空白处或文件夹上右击,就能显示
以管理员身份运行经典 CMD菜单选项。
进制
概述
计算机世界中只有二进制,所以计算机中存储和运算的所有数据都要转为二进制。包括数字、字符、图片、声音、视频等。

世界上有 10 种人 ,认识和不认识二进制的。
进制的分类
进制的分类:
十进制(decimal)
- 数字组成:0-9
- 进位规则:满十进一
二进制(binary)
- 数字组成:0-1
- 进位规则:满二进一,以
0b或0B开头
八进制(octal):很少使用
- 数字组成:0-7
- 进位规则:满八进一,以数字
0开头表示
十六进制
- 数字组成:0-9,a-f
- 进位规则:满十六进一,以
0x或0X开头表示。此处的 a-f 不区分大小写
代码演示:
class BinaryTest {
public static void main(String[] args) {
int num1 = 123; //十进制
int num2 = 0b101; //二进制
int num3 = 0127; //八进制
int num4 = 0x12aF; //十六进制
System.out.println(num1);
System.out.println(num2);
System.out.println(num3);
System.out.println(num4);
}
}进制的换算举例
| 十进制 | 二进制 | 八进制 | 十六进制 |
|---|---|---|---|
| 0 | 0 | 0 | 0 |
| 1 | 1 | 1 | 1 |
| 2 | 10 | 2 | 2 |
| 3 | 11 | 3 | 3 |
| 4 | 100 | 4 | 4 |
| 5 | 101 | 5 | 5 |
| 6 | 110 | 6 | 6 |
| 7 | 111 | 7 | 7 |
| 8 | 1000 | 10 | 8 |
| 9 | 1001 | 11 | 9 |
| 10 | 1010 | 12 | a 或 A |
| 11 | 1011 | 13 | b 或 B |
| 12 | 1100 | 14 | c 或 C |
| 13 | 1101 | 15 | d 或 D |
| 14 | 1110 | 16 | e 或 E |
| 15 | 1111 | 17 | f 或 F |
| 16 | 10000 | 20 | 10 |
二进制的由来
二进制,是计算技术中广泛采用的一种数制,由德国数理哲学大师莱布尼茨于 1679 年发明。
二进制数据是用 0 和 1 两个数码来表示的数。它的基数为 2,进位规则是“逢二进一”。
二进制广泛应用于我们生活的方方面面。比如,广泛使用的摩尔斯电码(Morse Code),它由两种基本信号组成:短促的点信号“·”,读“滴”;保持一定时间的长信号“—”,读“嗒”。然后,组成了 26 个字母,从而拼写出相应的单词。

记忆技巧:

我们偶尔会看到的:SOS,即为:

二进制转十进制
二进制如何表示整数?
计算机数据的存储使用二进制补码形式存储,并且最高位是符号位。
- 正数:最高位是 0
- 负数:最高位是 1
规定:
正数:补码与反码、原码一样,称为三码合一
负数:补码与反码、原码不一样:
负数的原码:把十进制转为二进制,然后最高位设置为 1
负数的反码:在原码的基础上,最高位不变,其余位取反(0 变 1,1 变 0)
负数的补码:反码+1

二进制转十进制:权相加法
针对于 byte 数据举例来说:

例如:byte 类型(1 个字节,8 位)
25 ==> 原码 0001 1001 ==> 反码 0001 1001 -->补码 0001 1001
-25 ==>原码 1001 1001 ==> 反码 1110 0110 ==>补码 1110 0111
整数:
正数:25 00000000 00000000 000000000 00011001(原码)
正数:25 00000000 00000000 000000000 00011001(反码)
正数:25 00000000 00000000 000000000 00011001(补码)
负数:-25 10000000 00000000 000000000 00011001(原码)
负数:-25 11111111 11111111 111111111 11100110(反码)
负数:-25 11111111 11111111 111111111 11100111(补码)为什么要使用原码、反码、补码表示形式呢?
计算机辨别“符号位”显然会让计算机的基础电路设计变得十分复杂!于是人们想出了将符号位也参与运算的方法。我们知道,根据运算法则减去一个正数等于加上一个负数, 即:1-1 = 1 + (-1) = 0 , 所以机器可以只有加法而没有减法,这样计算机运算的设计就更简单了。

一个字节可以存储的整数范围是多少?
//1个字节:8位
0000 0001 ~ 0111 111 ==> 1~127
1000 0001 ~ 1111 1111 ==> -127 ~ -1
0000 0000 ==>0
1000 0000 ==> -128(特殊规定)=-127-1十进制转二进制
十进制转二进制:除 2 取余的逆

二进制与八进制、十六进制间的转换
二进制转八进制

二进制转十六进制

八进制、十六进制转二进制

各进制间的转换

练习:
1.将以下十进制数转换为十六进制和二进制
123 256 87 62
2.将以下十六进制数转换为十进制和二进制
0x123 0x25F 0x38 0x62开发环境搭建
JDK/JRE/JVM
JDK(Java Development Kit):是 Java 程序开发工具包,包含JRE 和开发人员使用的工具。JRE(Java Runtime Environment):是 Java 程序的运行时环境,包含JVM 和运行时所需要的核心类库。JVM(Java Virtual Machine ,Java 虚拟机):是一个虚拟的计算机,是 Java 程序的运行环境。JVM 具有指令集并使用不同的存储区域,负责执行指令,管理数据、内存、寄存器。
如下是 Java 8.0 Platform:


小结:
JDK = JRE + 开发工具集(例如 Javac 编译工具等)
JRE = JVM + Java SE 标准类库
JDK 版本选择
- 自 Java 8 版本发布以来,其后的每次更新,都会有小伙伴高呼:Java8 YYDS!
- 论坛的声音:“你发任你发,我用 Java 8!”
数据说话 1:
JRebel 于 2022 年 4 月前后发布了《2022 年 Java 生态系统状况报告》,报告中提到使用 Java11 的占比最多,Java 8 紧随其后,如下图。而此前 2020 年的报告显示,Java8 占比达到了84.48%。

我的分析:
G1 是最受欢迎的 GC 算法。Java 11 及更高版本的 G1 收集器是默认的 GC,而 Java 8 中并不是。出于对 G1 的喜爱,很多开发者才会选择抛弃 Java 8。
数据说话 2:
此外,某美国软件开发商在对近千名专业的 Java 开发者调研后,发布的《2022 年 Java 开发者生产力报告》称:八年前发布的 Java 8 依然是 Java 中应用最广泛的版本,占比 37%,其次是 Java 11,占比29% 。
高斯林说话:

Spring 框架说话:
在 Java 17 正式发布之前,Java 开发框架 Spring 率先在官博宣布,Spring Framework 6 和 Spring Boot 3 计划在 2022 年第四季度实现总体可用性的高端基线:
Java 17+(来自 Spring Framework 5.3.x 线中的 Java 8-17)
Jakarta EE 9+(来自 Spring 框架 5.3.x 线中的 Java EE 7-8)
Spring 官方说明:https://spring.io/blog/2022/01/20/spring-boot-3-0-0-m1-is-now-available

意味着:springboot3.0 是需要用 java17 和 spring6.0 为基础建设。如果从企业选型最新 springboot3.0 作为架构来说,它搭配 jdk17 肯定是标配了。
JDK 的下载
- 下载网址(Oracle 公司官网):https://www.oracle.com/
- 下载步骤:如图所示,在官网底部选择 Developers 开发者

(1)在 Developers 页面中间的技术分类部分,选择Java,单击进入,如图所示:

(2)这里展示的是最新 Java 版本,例如 Java17。单击Download Java,然后选择具体的版本下载。

(3)选择 Download Java 按钮后

(4)如果想安装 Java8 可以选择如下位置:

(5)选择 Accept License Agreement,

(6)注册或登录后下载:

(7)如果需要安装其它版本,可以选择 Java archive:

接着进行选择下载即可:

JDK 的安装
安装说明:
- 傻瓜式安装,下一步即可。
- 建议:安装路径不要有中文或者空格等特殊符号。
- 本套课程会同时安装 JDK8 和 JDK17,并以 JDK17 为默认版本进行讲解。
安装步骤:
(1)双击jdk-17_windows-x64_bin.exe文件,并单击下一步,如图所示:

(2)修改安装路径,单击更改,如图所示:

(3)将安装路径修改为D:\develop_tools\jdk\jdk-17.0.2\,并单击下一步,如图所示:

(4)稍后几秒,安装完成,如图所示:


配置 path 环境变量
理解 path 环境变量
什么是 path 环境变量?
答:window 操作系统执行命令时,所要搜寻的路径。
为什么配置 path?
答:希望在命令行使用 javac.exe 等工具时,任意目录下都可以找到这个工具所在的目录。
以 JDK 为例演示
我们在C:\Users\songhk目录下使用 javac 命令,结果如下:

我们在 JDK 的安装目录的 bin 目录下使用 javac 命令,结果如下:

我们不可能每次使用 java.exe,javac.exe 等工具的时候都进入到 JDK 的安装目录下,太麻烦了。这时就需要配置 path 环境变量。
JDK8 配置方案 1:只配置 path
JDK8 配置步骤:
(1)打开桌面上的计算机,进入后在左侧找到此电脑,单击鼠标右键,选择属性,如图所示:

(2)选择高级系统设置,如图所示:

(3)在高级选项卡,单击环境变量,如图所示:

(4)在系统变量中,选中Path 环境变量,双击或者点击编辑 ,如图所示:

(5)点击新建,填入D:\develop_tools\jdk\jdk1.8.0_271\bin ,并将此值上移到变量列表的首位。如图所示:
编辑模式 1:

编辑模式 2:(注意,结尾需要有英文模式下的分号
;)
(6)环境变量配置完成,重新打开DOS 命令行,在任意目录下输入javac 或java命令或java -version,运行成功。


JDK8 配置方案 2:配置 JAVA_HOME+path(推荐)@
JDK8 配置步骤:
(1)打开桌面上的计算机,进入后在左侧找到计算机,单击鼠标右键,选择属性,如图所示:

(2)选择高级系统设置,如图所示:

(3)在高级选项卡,单击环境变量,如图所示:

以下步骤不同于方案 1:
(4)在系统变量中,单击新建 ,创建新的环境变量,如图所示:

(5)变量名输入JAVA_HOME,变量值输入 D:\develop_tools\jdk\jdk1.8.0_271 ,单击确定,如图所示:

(6)选中Path 环境变量,双击或者点击编辑 ,如图所示:

(7)在变量值的最前面,键入%JAVA_HOME%\bin。如图所示:

注意:强烈建议将%JAVA_HOME%\bin 声明在 path 环境变量中所有变量的最前面!
(8)环境变量配置完成,重启DOS 命令行,在任意目录下输入javac 或java命令或java -version,运行成功。


我想说:初学时不建议配置 classpath
有的书籍、论坛、视频上还提到配置 classpath,用于指名 class 文件识别的路径。其实是没必要的,反而建议大家如果配置了 classpath 环境变量,要删除。对于初学者,反而不友好。
小结如下:

JDK17 配置方案:自动配置
不管大家有没有提前安装 JDK8 或其它版本 JDK,在我们安装完 JDK17 之后,理应按 JDK8 的方式配置 path 环境变量。但是,我们发现在安装完 JDK17 以后,配置环境变量之前,执行 CMD 指令:

竟然成功了!而且是 17.0.2 版本。因为 JDK17 在安装之后,自动进行了环境变量的配置。如下:

其实这里配置的位置中不包含所有的 java 命令工具,存放在此处 java 工具的是阉割版。

思考:如果你仍然希望在 JDK8 下开发 Java 程序?如何做呢?
Java 核心机制:JVM
Java 语言的优缺点
Java 确实是从 C 语言和 C++语言继承了许多成份,甚至可以将 Java 看成是类 C 语言发展和衍生的产物。“青出于蓝,而胜于蓝”。
优点
跨平台性:这是Java 的核心优势。Java 在最初设计时就很注重移植和跨平台性。比如:Java 的 int 永远都是 32 位。不像 C++可能是 16,32,可能是根据编译器厂商规定的变化。
- 通过 Java 语言编写的应用程序在不同的系统平台上都可以运行。“
Write once , Run Anywhere”。
- 通过 Java 语言编写的应用程序在不同的系统平台上都可以运行。“
原理:JVM,只要在需要运行 java 应用程序的操作系统上,先安装一个 Java 虚拟机 (JVM ,Java Virtual Machine) 即可。由 JVM 来负责 Java 程序在该系统中的运行。


面向对象性:- 面向对象是一种程序设计技术,非常适合大型软件的设计和开发。面向对象编程支持封装、继承、多态等特性,让程序更好达到高内聚,低耦合的标准。
- 由于 C++为了照顾大量 C 语言使用者而兼容了 C,使得自身仅仅成为了带类的 C 语言,多少影响了其面向对象的彻底性!Java 则是完全面向对象的语言。
健壮性:吸收了 C/C++语言的优点,但去掉了其影响程序健壮性的部分(如指针、内存的申请与释放等),提供了一个相对安全的内存管理和访问机制。安全性高:Java 适合于网络/分布式环境,需要提供一个安全机制以防恶意代码的攻击。为了达到这个目标,在安全性方面 Java 投入了很大的精力,使 Java 可以很容易构建防病毒,防篡改的系统。如:安全防范机制(类 ClassLoader),如分配不同的名字空间以防替代本地的同名类、字节代码检查。
简单性:Java 就是 C++语法的简化版,我们也可以将 Java 称之为“
C++--”。比如:头文件,指针运算,结构,联合,操作符重载,虚基类等。高性能:Java 最初发展阶段,总是被人诟病“性能低”;客观上,高级语言运行效率总是低于低级语言的,这个无法避免。Java 语言本身发展中通过虚拟机的优化提升了几十倍运行效率。比如,通过JIT(JUST IN TIME,即时编译技术) 提高运行效率。 将一些“热点字节码”编译成本地机器码,并将结果缓存起来,在需要的时候重新调用。这样的话,使 Java 程序的执行效率大大提高,某些代码直接达到 C++的效率。
因此,Java 低性能的短腿,已经被完全解决了。业界发展上,我们也看到很多 C++应用转到 Java 开发,很多 C++程序员转型为 Java 程序员。
缺点
语法过于复杂、严谨:对程序员的约束比较多,与 python、php 等相比入门较难。但是一旦学会了,就业岗位需求量大,而且薪资待遇节节攀升。开发维护成本高:一般适用于大型网站开发,整个架构会比较重,对于初创公司开发和维护人员的成本比较高(即薪资高),选择用 Java 语言开发网站或应用系统的需要一定的经济实力。不适用于所有领域:在某些领域其他语言有更出色的表现,比如,Objective C、Swift 在 iOS 设备上就有着无可取代的地位。浏览器中的处理几乎完全由 JavaScript 掌控。Windows 程序通常都用 C++或 C#编写。Java 在服务器端编程和跨平台客户端应用领域则很有优势。
JVM 功能说明
JVM(Java Virtual Machine ,Java 虚拟机):是一个虚拟的计算机,是Java 程序的运行环境。JVM 具有指令集并使用不同的存储区域,负责执行指令,管理数据、内存、寄存器。

功能 1:实现 Java 程序的跨平台性
实现跨平台性:我们编写的 Java 代码,都运行在JVM 之上。正是因为有了 JVM,才使得 Java 程序具备了跨平台性。

使用 JVM 前后对比:

功能 2:自动内存管理(内存分配、内存回收)
- Java 程序在运行过程中,涉及到运算的数据的分配、存储等都由 JVM 来完成
- Java 消除了程序员回收无用内存空间的职责。提供了一种系统级线程跟踪存储空间的分配情况,在内存空间达到相应阈值时,检查并释放可被释放的存储器空间。
- GC 的自动回收,提高了内存空间的利用效率,也提高了编程人员的效率,很大程度上减少了因为没有释放空间而导致的内存泄漏。
面试题:
Java 程序还会出现内存溢出和内存泄漏问题吗? Yes!
HelloWorld
JDK 安装完毕,我们就可以开发第一个 Java 程序了,习惯性的称为:HelloWorld。
Java 程序开发三步骤:编写、编译、运行。
- 将 Java 代码编写到扩展名为
.java的源文件中 - 通过
javac.exe命令对该 java 文件进行编译,生成一个或多个字节码文件 - 通过
java.exe命令对生成的 class 文件进行运行

步骤 1:编写
编写代码步骤:
(1)新建.java文件:在D:\JavaSE\chapter01 目录下新建文本文件,完整的文件名修改为HelloWorld.java,其中文件名为HelloWorld,后缀名必须为.java。

(2)打开文件:用记事本或 editplus 等文本编辑器打开(虽然记事本也可以,但是没有关键字颜色标识,不利于初学者学习)
(3)编写代码:在文件中输入如下代码,并且保存:
class HelloChina {
public static void main(String[] args) {
System.out.println("HelloWorld!!");
}
}Java 程序结构和格式:
Java 程序的结构:
java类 { 方法 { 语句; } }- 每一级缩进一个 Tab 键
{}的左半部分在行尾,右半部分单独一行,与和它成对的"{"的行首对齐
Java 程序的入口:
main方法javapublic static void main(String[] args){} 两种常见的输出语句:
println():换行输出语句,输出内容,完毕后进行换行。
- 注意:括号内可以什么都不写,只做换行处理
javaSystem.out.println(输出内容);print():直接输出语句,输出内容,完毕后不做任何处理。
- 注意:括号内什么都不写的话,编译报错
javaSystem.out.print(输出内容);
友情提示:
每个字母和符号必须与示例代码一模一样,包括大小写在内。
显示文件扩展名:

或

第一个HelloWord 源程序就编写完成了,但是这个文件是程序员编写的,JVM 是看不懂的,也就不能运行,因此我们必须将编写好的Java源文件 编译成 JVM 可以看懂的字节码文件 ,也就是.class文件。
步骤 2:编译
命令工具:javac
思路:在 DOS 命令行中,进入D:\JavaSE\chapter01目录,使用javac 命令进行编译。
命令格式:
javac Java源文件名.java编译步骤:
1、使用文件资源管理器打开D:\JavaSE\chapter01目录,然后在地址栏输入 cmd。

2、使用javac 命令编译 HelloWorld.java 文件。
javac HelloWorld.java
3、编译成功后,命令行没有任何提示。打开D:\JavaSE\chapter01目录,发现产生了一个新的文件 HelloChina.class,该文件就是编译后的文件,是 Java 的可运行文件,称为字节码文件,有了字节码文件,就可以运行程序了。
步骤 3:运行
命令工具:java
思路:在 DOS 命令行中,在字节码文件目录下,使用java 命令进行运行。
命令格式:
java 主类名字主类:是指包含 main 方法的类,main 方法是 Java 程序的入口:
javapublic static void main(String[] args){}
示例:使用java 命令运行编译后的字节码文件的主类
java HelloChina
错误演示:主类名后不能跟
.class后缀java HelloChina.class
常见错误
拼写问题
**单词拼写问题**text正确:class 错误:Class 正确:String 错误:string 正确:System 错误:system 正确:main 错误:mianJava 语言是一门严格区分大小写的语言
**标点符号使用问题**- 不能用中文符号,英文半角的标点符号(正确)
- 括号问题,成对出现
编译、运行路径问题
找不到文件:
- 源文件名不存在或者写错
- 当前路径错误
- 后缀名隐藏问题

找不到或无法加载主类:
- 类文件名写错,尤其文件名与类名不一致时,要小心
- 类文件不在当前路径下,或者不在 classpath 指定路径下

语法问题
声明为 public 的类应与文件名一致,否知编译失败

编译失败,注意错误出现的行数,再到源代码中指定位置改错

字符编码问题
问题:字符编码不一致
当 cmd 命令行窗口的字符编码与.java 源文件的字符编码不一致,如何解决?

解决:
方案一:修改源文件的字符编码
在 Notepad++等编辑器中,修改源文件的字符编码:

在 EditPlus 中可以将 Java 源文件另存为 ANSI 编码方式(中文操作系统下即为 GBK 字符集)

方案二:使用 javac 命令时指定源文件字符编码
shjavac -encoding utf-8 Review01.java
编写建议
注意缩进
一定要有缩进。缩进就像人得体的衣着一样!
只要遇到
{}就缩进,缩进的快捷键tab键。
必要的空格
变量类型、变量、赋值符号、变量值之间填充相应空格,更美观。比如: int num = 10;
源文件名与类名
(1)源文件名是否必须与类名一致?public 呢?
- 如果这个类不是 public,那么源文件名可以和类名不一致。但是不便于代码维护。
- 如果这个类是 public,那么要求源文件名必须与类名一致。否则编译报错。
- 我们建议大家,不管是否是 public,都与源文件名保持一致,而且一个源文件尽量只写一个类,目的是为了好维护。
(2)一个源文件中是否可以有多个类?public 呢?
- 一个源文件中可以有多个类,编译后会生成多个.class 字节码文件。
- 但是一个源文件只能有一个 public 的类。
章节案例
案例 1:个人信息输出

class Exercise1{
public static void main(String[] args){
System.out.println("姓名:康师傅");
System.out.println();//换行操作
System.out.println("性别:男");
System.out.println("家庭住址:北京程序员聚集地:回龙观");
}
}案例 2:输出:心形
结合\n(换行),\t(制表符),空格等在控制台打印出如下图所示的效果。

方式一:
//方式一:
class Exercise2{
public static void main(String[] args){
System.out.print("\t");
System.out.print("*");
System.out.print("\t");
System.out.print("\t");
System.out.print("\t");
System.out.print("\t");
System.out.print("\t");
System.out.print("\t");
System.out.print("\t");
System.out.println("*");
System.out.print("*");
System.out.print("\t");
//System.out.print("\t");
System.out.print("\t");
System.out.print("\t");
System.out.print("I love java");
System.out.print("\t");
System.out.print("\t");
System.out.print("\t");
System.out.print("\t");
System.out.print("\t");
System.out.println("*");
System.out.print("\t");
System.out.print("*");
System.out.print("\t");
System.out.print("\t");
System.out.print("\t");
System.out.print("\t");
System.out.print("\t");
System.out.print("\t");
System.out.print("\t");
System.out.println("*");
System.out.print("\t");
System.out.print("\t");
System.out.print("*");
System.out.print("\t");
System.out.print("\t");
System.out.print("\t");
System.out.print("\t");
System.out.print("\t");
System.out.println("*");
System.out.print("\t");
System.out.print("\t");
System.out.print("\t");
System.out.print("*");
System.out.print("\t");
System.out.print("\t");
System.out.print("\t");
System.out.println("*");
System.out.print("\t");
System.out.print("\t");
System.out.print("\t");
System.out.print("\t");
System.out.print("*");
System.out.print("\t");
System.out.println("*");
System.out.print("\t");
System.out.print("\t");
System.out.print("\t");
System.out.print("\t");
System.out.print(" ");
System.out.print("*");
}
}方式二:
class Exercise3{
public static void main(String[] args){
System.out.print("\t"+"*"+"\t\t\t\t\t\t\t\t\t\t\t\t"+"*"+"\t"+"\n");
System.out.print("*"+"\t\t"+"*"+"\t\t\t\t"+"I love Java"+"\t\t\t\t"+"*"+"\t\t\t"+"*"+"\n");
System.out.print("\t"+"*"+"\t\t\t\t\t\t\t\t\t\t\t\t"+"*"+"\t"+"\n");
System.out.print("\t\t"+"*"+"\t\t\t\t\t\t\t\t\t\t"+"*"+"\t\t"+"\n");
System.out.print("\t\t\t"+"*"+"\t\t\t\t\t\t\t\t"+"*"+"\t"+"\n");
System.out.print("\t\t\t\t"+"*"+"\t\t\t\t\t\t"+"*"+""+"\t"+"\n");
System.out.print("\t\t\t\t\t"+"*"+"\t\t\t\t"+"*"+""+"\t\t"+"\n");
System.out.print("\t\t\t\t\t\t"+"*"+"\t\t"+"*"+""+"\t\t"+"\n");
System.out.print("\t\t\t\t\t\t\t"+"*"+"\n");
}
}